package com.zeny.express.framework.shared.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.zeny.express.framework.shared.exception.ApplicationException;

/**
 * Zip 
 * @author zhuwei
 * @date 2013年9月4日 下午3:09:35
 */
public class GzipUtils {

	/**
	 * 日志
	 */
	protected static final Log LOG = LogFactory.getLog(GzipUtils.class);

	/**
	 * GZIP压缩
	 * @author zhuwei
	 * @date 2013年9月4日 下午3:11:10
	 * @param str
	 * @return 
	 */
	public static String compress(String str) {
		if (str == null || str.length() == 0) {
			return str;
		}
		
		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			GZIPOutputStream gzip;
			gzip = new GZIPOutputStream(out);
			gzip.write(str.getBytes());
			gzip.close();
			return out.toString("ISO-8859-1");
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			throw new ApplicationException(ApplicationException.UNKNOWN, null);
		}
		
	}

	/**
	 * GZIP解压缩
	 * @author zhuwei
	 * @date 2013年9月4日 下午3:12:00
	 * @param str
	 * @return 
	 */
	public static String uncompress(String str) {
		if (str == null || str.length() == 0) {
			return str;
		}
		
		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			ByteArrayInputStream in = new ByteArrayInputStream(
					str.getBytes("ISO-8859-1"));
			GZIPInputStream gunzip = new GZIPInputStream(in);
			byte[] buffer = new byte[256];
			int n;
			while ((n = gunzip.read(buffer)) >= 0) {
				out.write(buffer, 0, n);
			}
			// toString()使用平台默认编码，也可以显式的指定如toString("GBK")
			return out.toString();
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			throw new ApplicationException(ApplicationException.UNKNOWN, null);
		}
		
	}

}
